//
// Created by 32827 on 2024/6/24.
//

#ifndef STM32F407RTOS_YZF_TIM_H
#define STM32F407RTOS_YZF_TIM_H
#include "yzf.h"

/**
 * 开启时钟
 * @param p_tim 例如TIM1,TIM2
 * */
YZF_RESULT yzf_tim_open_clock(YZF_TIM_POINTER p_tim);

/**
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_enable(YZF_TIM_POINTER p_tim);
YZF_RESULT yzf_tim_disable(YZF_TIM_POINTER p_tim);

/**
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_update_event_disable(YZF_TIM_POINTER p_tim);
YZF_RESULT yzf_tim_update_event_enable(YZF_TIM_POINTER p_tim);

/**
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_update_source(YZF_TIM_POINTER p_tim, uint8_t source);

/**
 * 递增方向
 * @param isSub 是否递减
 * @note 基本时钟不支持
 * */
YZF_RESULT yzf_tim_set_dir(YZF_TIM_POINTER p_tim, YZF_BOOL isSub);

/**
 * 单脉冲模式
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_set_one_pulse_mode(YZF_TIM_POINTER p_tim,YZF_BOOL isOne);

/**
 * 设置时钟分频 f(out) = f(APB)/[(psc+1)*(arr)*(clk_division)]
 * @note 基本时钟不支持
 * */
YZF_RESULT yzf_tim_set_clock_division(YZF_TIM_POINTER p_tim, uint8_t division);

/**
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_auto_reload_enable(YZF_TIM_POINTER p_tim);
YZF_RESULT yzf_tim_auto_reload_disable(YZF_TIM_POINTER p_tim);

/**
 * 获取时钟更新中断标志
 * @note 全部支持
 * */
YZF_BOOL yzf_tim_get_update_interrupt_flag(YZF_TIM_POINTER p_tim,YZF_BOOL isClear);

/**
 * 生成时钟更新事件
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_create_update_event(YZF_TIM_POINTER p_tim);

/**
 * 计数器 获取/设置
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_set_cnt(YZF_TIM_POINTER p_tim, uint32_t cnt);
YZF_RESULT yzf_tim_get_cnt(YZF_TIM_POINTER p_tim, uint32_t *cnt);

/**
 * 预分频 获取/设置
 * f(out) = f(APB)/[(psc+1)*(arr)*(clk_division)]
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_set_prescaler(YZF_TIM_POINTER p_tim, uint16_t prescaler);
YZF_RESULT yzf_tim_get_prescaler(YZF_TIM_POINTER p_tim, uint16_t *prescaler);

/**
 * 自动加载寄存器 获取/设置
 * @note 全部支持
 * */
YZF_RESULT yzf_tim_set_auto_reload_number(YZF_TIM_POINTER p_tim,uint16_t arr);
YZF_RESULT yzf_tim_get_auto_reload_number(YZF_TIM_POINTER p_tim,uint16_t *arr);

YZF_RESULT yzf_tim_select_mms(YZF_TIM_POINTER p_tim,uint16_t mms);

/**
 *  TIMx 捕获/比较模式寄存器 TIMx capture/compare mode register
 * @note
 * <br>这些位定义提供 OC1 和 OC1N 的输出参考信号 OC1REF 的行为。OC1REF 为高电平有
 * <br>效，而 OC1 和 OC1N 的有效电平则取决于 CC1P 位和 CC1NP 位。
 * <br>000：冻结––输出比较寄存器 TIMx_CCR1 与计数器 TIMx_CNT 进行比较不会对输出造成
 * <br>任何影响。（该模式用于生成时基）。
 * <br>001：将通道 1 设置为匹配时输出有效电平。当计数器 TIMx_CNT 与捕获/ 比较寄存器 1
 * <br>(TIMx_CCR1) 匹配时，OC1REF 信号强制变为高电平。
 * <br>010：将通道 1 设置为匹配时输出无效电平。当计数器 TIMx_CNT 与捕获/ 比较寄存器 1
 * <br>(TIMx_CCR1) 匹配时，OC1REF 信号强制变为低电平。
 * <br>011：翻转––TIMx_CNT=TIMx_CCR1 时，OC1REF 发生翻转。
 * <br>100：强制变为无效电平––OC1REF 强制变为低电平。
 * <br>101：强制变为有效电平––OC1REF 强制变为高电平。
 * <br>110：PWM 模式 1––在递增计数模式下，只要 TIMx_CNT<TIMx_CCR1，通道 1 便为有
 * <br>效状态，否则为无效状态。在递减计数模式下，只要 TIMx_CNT>TIMx_CCR1，通道 1 便为
 * <br>无效状态 (OC1REF=0)，否则为有效状态 (OC1REF=1)。
 * <br>111：PWM 模式 2––在递增计数模式下，只要 TIMx_CNT<TIMx_CCR1，通道 1 便为无
 * <br>效状态，否则为有效状态。在递减计数模式下，只要 TIMx_CNT>TIMx_CCR1，通道 1 便为
 * <br>有效状态，否则为无效状态。
 * <br>注意：在 PWM 模式 1 或 PWM 模式 2 下，仅当比较结果发生改变或输出比较模式由“冻结”
 * <br>模式切换到“PWM”模式时，OCREF 电平才会发生更改。
 * */
YZF_RESULT yzf_tim_out_compare_mode_set(YZF_TIM_POINTER p,uint16_t ch_id,uint16_t mode);

/**
 * TIMx 捕获/比较使能寄存器
 * */
YZF_RESULT yzf_tim_capture_compare_enable(YZF_TIM_POINTER p_tim,uint16_t ch_id,YZF_BOOL isEnable);
YZF_RESULT yzf_tim_capture_compare_data_set(YZF_TIM_POINTER p_tim,uint16_t ch_id,uint32_t data);
#endif //STM32F407RTOS_YZF_TIM_H
